# coding: utf-8

import webapp2
import jinja2
import os
from settings import STATIC_PATH
import core.search
import data.provider

from google.appengine.api import memcache

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname("templetes/")))
    
class MainPage(webapp2.RequestHandler):   
    def get(self):
        p = data.provider.Providers()
        keyword = self.request.get('keyword')           # 검색 키워드, 기본값: *
        area = self.request.get('area')                 # 판매 지역, 기본갑: *
        providerid = self.request.get('providerid')     # 소셜 커머스 업체 ID, 기본값: *
        start = self.request.get('start')               # 결과 집합의 시작 인덱스, 기본값: 0
        limit = self.request.get('limit')               # 결과 집합에서 데이터를 가지고 올 개수, 기본값: 0
        expired = self.request.get('expired')           # 판매 기간이 지난 물품도 검색할지 여부, 기본값: 1(포함)
        action = self.request.get('action')             # 검색 방식을 지정, 기본값: exact
        output = self.request.get('output')             # 검색 결과의 출력 포멧을 지정, 기본값: xml
        
        # 기본 인자 설정
        if keyword == "":   keyword = "*" 
        if area == "":      area = "*" 
        if action == "":    action = "exact"
        if output == "":    output = "xml"
        providerid = int(providerid) if providerid != "" else p.AllProvider
        start = int(start) if start != "" else 0
        limit = int(limit) if limit != "" else 10
        expired = int(expired) if expired != "" else 1
        
        # 데이터스트어 조회 이전에 Memcache에 캐싱된 데이터를 확인
        cache_key = "" + keyword +"_"+area+"_" + str(providerid)+"_"+str(start)+"_"+str(limit)+"_"+action+"_"+str(expired);
        cache = memcache.Client()
        product_list = cache.get(cache_key)
        related_keyword = cache.get("related_keyword"+cache_key)
        
        # Memcache에 캐싱된 데이터가 없는 경우
        if product_list is None:            
            if action == "exact" or keyword == "*":            
                product_list = core.search.SearchProducts.exactSearch(keyword, area, providerid, start, limit, expired)
                related_keyword = ""
            else:
                product_list, related_keyword = core.search.SearchProducts.relatedSearch(keyword, area, providerid, start, limit, expired)
                related_keyword = ",".join(related_keyword)
            # 데이터스토어에서 조회한 내용을 Memcache에 입력
            cache.add(cache_key, product_list, 3600);
            cache.add("related_keyword"+cache_key, related_keyword, 3600);
        if related_keyword is None:
            related_keyword = ""
        
        # 출력 형식이 html인 경우
        if(output == "html") :
            self.response.headers['Content-Type'] = 'text/html;charset=UTF-8'
            template = jinja_environment.get_template('search.html')
            
            for product in product_list:
                if(product.price_now < 0):
                    product.price_now = 0 
                if(keyword != ""):
                    product.title = product.title.replace(keyword, "<span class='search_keyword'>" + keyword + "</span>")
                if(related_keyword != ""):
                    for related_key in related_keyword.split(","):
                        product.title = product.title.replace(related_key, "<span class='search_keyword'>" + related_key + "</span>")
            
            if start != 0 or keyword == "*":
                related_keyword = ""
        else:   # 출력 형식이 XML인 경우
            self.response.headers['Content-Type'] = 'text/xml'
            template = jinja_environment.get_template('search.xml')
        
        self.response.out.write(template.render({"static_path" : STATIC_PATH,
                                                 "items": product_list, 
                                                 "keyword": keyword, 
                                                 "related_keyword": related_keyword,
                                                 "area": area, 
                                                 "provider": providerid, 
                                                 "start": start, 
                                                 "limit": limit, 
                                                 "expired": expired}))
        
app = webapp2.WSGIApplication([('/searcher', MainPage)], debug=True)